计划阅读调试下Dubbo的源码,结合官方源码分析Dubbo,自身再分析总结
本文对应的Dubbo 服务调用过程
代理
回到最开始的例子
1 | // 客户端 |
从context#getBean获取到的是动态生成的DemoService代理类。大致如下
1 | public class proxy0 |
在调用sayHello方法时,此方法的核心部分为 this.handler.invoke 方法。这里的InvocationHandler对应的是InvokerInvocationHandler
进入InvokerInvocationHandler
1 | public class InvokerInvocationHandler implements InvocationHandler { |
进入MockClusterInvoker方法内
1 |
|
主要分析no mock部分
对于invoker部分默认的是FailoverClusterInvoker
进入FailoverClusterInvoker,以及基类 AbstractClusterInvoker
1 | public abstract class AbstractClusterInvoker<T> implements Invoker<T> { |
进入DubboInvoker方法中
1 | public abstract class AbstractInvoker<T> implements Invoker<T> { |
传输层
我们继续后续流程,之后的操作是到currentClient中。这里的currentClients是DubboProtocol#ref中初始化的
对应的是ReferenceCountExchangeClient
1 |
|
可以看到connect返回了HeaderExchangeClient,其中Transporters#connect方法返回是对应着默认的NettyTransporter#connect
1 |
|
最终得到了NettyClient
所以最后的request方法通过ReferenceCountExchangeClient -> HeaderExchangerClient
继续看HeaderExchangerClient
1 | public class HeaderExchangeClient implements ExchangeClient { |
真正执行request的是ExchangeChannel
继续往下看
1 | final class HeaderExchangeChannel implements ExchangeChannel { |
继续进入NettyClient以及基类方法中
1 |
|